// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
//requset包
const request = require('request')

async function getNewToken() {
  //接口地址：https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
  //返回数据格式: {"access_token": "ACCESS_TOKEN", "expires_in": 7200}

  let appid = 'wx159a31cbaf45bec5'; //公众号appid
  let appsecret = '3234b39bb6efbddb496b62ba7617ac02'; // 公众号 appsecret
  let grant_type = "client_credential"; //授权（必填）
  let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret;
  // 2020-07-15 更新url路径--> 为了固定出口IP，先去调用腾讯云云函数，通过云函数去调用上述url（注意：更改为了 http get 方法）
  // 在云函数中固定了出口IP： 81.68.156.227
  // let proxy_url = "https://service-akhhhv2n-1254273366.sh.apigw.tencentcs.com/release/get_public_access_token"
  //新建promise对象，发起http统一下单请求
  return new Promise((resolve, reject) => {
    try {
      request.get({
        url: url,
        method: "GET",
      },
        function (error, response, body) {
          console.log(body, error)
          if (!error && response.statusCode == 200) {
            console.log(body)
            let newToken = JSON.parse(body)
            return resolve(newToken)
          } else {
            return reject(error)
          }
        })
    } catch (e) {
      return reject(error)
    }
  })
}

// 云函数入口函数
exports.main = async (event, context) => {
  let token = '';
  //数据库中的token集合 token{}
  let queryToken = await db.collection('publicParams').get();
  if (queryToken.errMsg == 'collection.get:ok') //查询成功
  {
    let record = queryToken.data[0];
    let lastTime = record.token_last_timestamp; //上次记录token的时间戳
    let thisTime = Date.parse(new Date()) //当前时间的时间戳
    if ((thisTime - lastTime) > 7000000) //token快过期需要重新获取
    {
      let httpToken = await getNewToken(); //发出http请求获取新的token

      if ('access_token' in httpToken) //
      {
        //(1)成功获取新的token
        //1.1 记录新的token和当前时间
        let update = await db.collection('publicParams').doc('XG6bk3kPDdDCJ5vz')
          .update({
            data: {
              access_token: httpToken.access_token,
              token_last_timestamp: thisTime
            }
          })
        if (update.errMsg == 'document.update:ok') {
          return httpToken.access_token;
        } else {
          return ''; //执行token更新失败，则返回token为空
        }
      } else {
        return ''; //执行http生成token失败，也返回空
      }
    } else //token尚未过期,可以直接使用
    {
      return record.access_token;
    }
  }
}